import { ClusterTraObject } from './ClusterTraObject';
import { TraObject } from './TraObject';

/*
类： 轨迹图层树节点
属性：
    label：标签（名字）
    children：子节点
    coords：坐标序列
    color：图层颜色
方法：
    createTree：
        input：轨迹对象集合
        output：构建的图层树
    transToNode：
        input：轨迹对象
        output：将轨迹对象转为树的节点

*/
class TraLayersTreeNode {
  label;
  children;
  coords;
  color;

  static createTree(traObjects) {
    let tree = [];
    // 遍历轨迹集合对象
    for (let obj of traObjects) {
      let treeNode = TraLayersTreeNode.transToNode(obj);
      tree.push(treeNode);
    }
    return tree; //更新图层树对象
  }
  static transToNode(traObject) {
    let rootNode = new TraLayersTreeNode(traObject.fileName); //根节点
    // 是聚类算法执行的结果
    if (traObject instanceof ClusterTraObject) {
      let labelNode = null;
      //遍历所有轨迹的标签
      traObject.labels.forEach((value, index) => {
        const labelIsExist = rootNode.children.some((item) => {
          return item.label === value;
        }); //判断当前标识该类的节点是否被创建
        if (!labelIsExist) {
          labelNode = new TraLayersTreeNode(value, [], [], TraObject.getRandomColor());
          rootNode.children.push(labelNode); // 创建表示该类的子节点
        } else {
          labelNode = rootNode.children.find((item) => {
            return item.label === value;
          }); //找到表示该类的子节点
        }
        // 创建子节点对象(表示图层中具体的每一条轨迹)
        let childNode = new TraLayersTreeNode(
          traObject.fileName + `_${index}`,
          [],
          traObject.coordsList[index],
          labelNode.color,
        );
        labelNode.children.push(childNode);
      });
    }
    // 是上传的文件或是压缩的结果
    else {
      //遍历每一个对象中的坐标序列(每一个序列是一条轨迹)
      traObject.coordsList.forEach((value, index) => {
        // 创建子节点对象(表示图层中具体的每一条轨迹)
        let childNode = new TraLayersTreeNode(
          traObject.fileName + `_${index}`,
          [],
          value,
          traObject.color,
        );
        rootNode.children.push(childNode);
      });
    }
    return rootNode;
  }

  constructor(label, children = [], coords = [], color = 'rgba(255,255,255)') {
    this.label = label;
    this.children = children;
    this.coords = coords;
    this.color = color;
  }
}

export { TraLayersTreeNode };
